import Guacamole from "guacamole-common-js";
import { getCapAppInfo, insertOpenAppLogs, bindWinSessionId } from '@/api/cap'
import { ElMessage } from 'element-plus'

export const getQueryParams = (url: string) => {
  const paramArr = url.slice(url.indexOf("?") + 1).split("&");
  const params = new Map();
  paramArr.map(param => {
    const [key, val] = param.split("=");
    params.set(key, decodeURIComponent(val));
  });
  return params;
};

// VCMsgForOpenApp 通过虚拟通道打开应用
export const VCMsgForOpenApp = (desktopObj: any) => {
  console.log("通过虚拟通道发送打开应用的消息");
  const param = getQueryParams(window.location.href);
  getCapAppInfo(param.get("linkId")).then(res => {
    console.log(res)
    const params: ChannelMsgForAppParams = {
      appName: res.appName,
      hostSessionId: res.hostSessionId,
      appId: res.linkId,
      exePath: res.exePath,
      workDir: res.workDir,
      params: res.params
    };
    const msg: ChannelMsg = {
      code: 2, // 打开应用
      data: JSON.stringify(params)
    };
    ElMessage({
      message: "准备打开应用【" + res.appName + "】",
      type: "success"
    });
    const writer = new Guacamole.StringWriter(
      desktopObj.client.createPipeStream("application/octet-stream", "LAUNCH")
    );
    writer.sendText(JSON.stringify(msg));
  });
};
export const noticeInsertOpenAppLogs = (dataStr: string) => {
  const dataJson = JSON.parse(dataStr)
  insertOpenAppLogs(dataJson.appId, dataJson.hostSessionId, dataJson.winSessionId)
}
export const noticeBindWinSessionId = (winSessionId: string) => {
  const param = getQueryParams(window.location.href);
  bindWinSessionId(param.get("sessionId"), winSessionId)
}

export type ChannelMsg = {
  code: number;
  data: string;
};

export type ChannelMsgForAppParams = {
  appName: string
  hostSessionId: string;
  appId: string;
  exePath: string;
  workDir: string;
  params: string[];
};

export type ChannelMsgForOpenAppSuccess = {
  appId: string;
  winSessionId: string;
  hostSessionId: string;
};

function getCodeDetail(code: number) {
  switch (code) {
    case Guacamole.Status.Code.UNSUPPORTED:
      console.error("客户端不支持", code);
      return "客户端不支持";
    case Guacamole.Status.Code.SERVER_ERROR:
      console.error("服务端错误", code);
      return "服务端错误";
    case Guacamole.Status.Code.SERVER_BUSY:
      console.error("服务端忙", code);
      return "服务端忙";
    case Guacamole.Status.Code.UPSTREAM_TIMEOUT:
      console.error("上游超时", code);
      return "上游超时";
    case Guacamole.Status.Code.UPSTREAM_ERROR:
      console.error("上游错误", code);
      return "上游错误";
    case Guacamole.Status.Code.RESOURCE_NOT_FOUND:
      console.error("资源没找到", code);
      return "资源没找到";
    case Guacamole.Status.Code.RESOURCE_CONFLICT:
      console.error("资源冲突", code);
      return "资源冲突";
    case Guacamole.Status.Code.RESOURCE_CLOSED:
      console.error("资源已关闭", code);
      return "资源已关闭";
    case Guacamole.Status.Code.UPSTREAM_NOT_FOUND:
      console.error("上游未发现", code);
      return "上游未发现";
    case Guacamole.Status.Code.UPSTREAM_UNAVAILABLE:
      console.error("上游不可用", code);
      return "上游不可用";
    case Guacamole.Status.Code.SESSION_CONFLICT:
      console.error("会话冲突", code);
      return "会话冲突";
    case Guacamole.Status.Code.SESSION_TIMEOUT:
      console.error("会话超时", code);
      return "会话超时";
    case Guacamole.Status.Code.SESSION_CLOSED:
      console.error("会话关闭", code);
      return "会话关闭";
    case Guacamole.Status.Code.CLIENT_BAD_REQUEST:
      console.error("客户端错误的请求", code);
      return "客户端错误的请求";
    case Guacamole.Status.Code.CLIENT_UNAUTHORIZED:
      console.error("客户端认证失败", code);
      return "客户端认证失败";
    case Guacamole.Status.Code.CLIENT_FORBIDDEN:
      console.error("客户端禁止访问", code);
      return "客户端禁止访问";
    case Guacamole.Status.Code.CLIENT_TIMEOUT:
      console.error("客户端超时", code);
      return "客户端超时";
    case Guacamole.Status.Code.CLIENT_OVERRUN:
      console.error("客户端重复", code);
      return "客户端重复";
    case Guacamole.Status.Code.CLIENT_BAD_TYPE:
      console.error("错误的客户端类型", code);
      return "错误的客户端类型";
    case Guacamole.Status.Code.CLIENT_TOO_MANY:
      console.error("客户端连接过多", code);
      return "客户端连接过多";
  }
}

// | 514  | UPSTREAM_TIMEOUT     | 上游服务器无响应。大部分情况下，上游服务器是远程桌面服务器   |
// | 515  | UPSTREAM_ERROR       | 上游服务器错误。大部分情况下，上游服务器是远程桌面服务器     |
// | 516  | RESOURCE_NOT_FOUND   | 关联的文件、或流资源未找到，操作失败                         |
// | 517  | RESOURCE_CONFLICT    | 资源正在本使用或被锁住，操作请求被阻止                       |
// | 518  | RESOURCE_CLOSED      | 关联的资源已经被关闭，操作无法继续                           |
// | 519  | UPSTREAM_NOT_FOUND   | 上游服务器未找到，或在网络中丢失。大部分情况下，上游服务器是远程桌面服务器 |
// | 520  | UPSTREAM_UNAVALIABLE | 上游服务器拒绝连接服务。大部分情况下，上游服务器是远程桌面服务器 |
// | 768  | CLIENT_BAD_REQUEST   | 请求参数非法或无效                                           |
// | 769  | CLIENT_UNAUTHORIZED  | 因用户未登陆产生的无权限。注意，用户可能已登陆到 Occamy，但没有登陆到对应的远程桌面服务器 |
// | 771  | CLIENT_FORBIDDEN     | 缺少权限，登陆无法解决此问题                                 |
// | 776  | CLIENT_TIMEOUT       | 客户端超时，通常为用户的 Occamy 或浏览器                  |
// | 781  | CLIENT_VOERRUN       | 客户端发送了协议允许的更多数据                               |
// | 783  | CLIENT_BAD_TYPE      | 客户端发送的数据包含非法类型                                 |
// | 797  | CLIENT_TOO_MANY      | 客户端已使用太多资源。在产生新的请求前，旧资源必须被释放     |
// 下面是我自己定义的错误码
// | 802  | ForcedDisconnect     | 管理员调用GO端接口强制关闭了ws的连接     |
// | 806  | ForcedDisconnect     | 管理员调用GO端接口强制关闭了ws的连接，关闭后会执行注销会话操作     |
const statusCode = {
  514: "连接【后端服务器】失败，连接超时", //    UPSTREAM_TIMEOUT
  515: "连接【后端服务器】失败，服务端错误", //    UPSTREAM_ERROR
  516: "连接【516】失败", // RESOURCE_NOT_FOUND
  517: "连接【517】失败", // RESOURCE_CONFLICT
  518: "连接【518】失败", // RESOURCE_CLOSED
  519: "连接【登录到远程桌面】失败", // UPSTREAM_NOT_FOUND
  520: "连接【登录到远程桌面】失败", // UPSTREAM_UNAVALIABLE
  768: "连接【后端服务器】失败，请求参数非法或无效", // UPSTREAM_UNAVALIABLE
  769: "连接【后端服务器】失败，登陆失败" // UPSTREAM_UNAVALIABLE
};

export { getCodeDetail, statusCode };
